package server.commonData;

import java.util.Calendar;
import java.util.Map;
import java.util.Random;

/**
 * 很杂的工具类
 * @author  jinmiao
 *
 */
public class Utils 
{
	
	/** 计算秒偏移量时的起始时间   2013年的1月1日12:00:00*/
	public static long timeBegin = 0;
	
	static
	{
		Calendar calender = Calendar.getInstance();
		calender.set(Calendar.YEAR, 2013);
		calender.set(Calendar.MONTH, Calendar.JANUARY);
		calender.set(Calendar.DAY_OF_YEAR, 1);
		calender.set(Calendar.HOUR_OF_DAY, 12);
		calender.set(Calendar.MINUTE, 0);
		calender.set(Calendar.SECOND, 0);
		timeBegin = calender.getTimeInMillis();
	}
	
	
	/** 让当前线程休眠指定的毫秒数，可以省去try,catch的代码 */
	public static void delay(long millis)
	{
		try
		{
			Thread.sleep(millis);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 随即一个  包含start 不包含end之间的数
	 * @param start
	 * @param end
	 * @return
	 */
	public static int randomIntIncludeStart(int start,int end)
	{
		return (new Random()).nextInt(end-start)+start;
	}
	
	/**
	 * 获得随即一个boolean值
	 * @return
	 */
	public static boolean ranBoolean()
	{
		return (new Random()).nextBoolean();
	}
	
	/** 得到当前时间，秒为单位 ,支持开始时间向后偏移65年 */
	public static int currentTimeSecond()
	{

		return (int) ((System.currentTimeMillis() - timeBegin) / 1000);
	}
	/** 用默认的类加载器加载一个指定名称的对象 */
	public static Object loadObject(String name)
	{
		return loadObject(name, null);
	}

	/** 用指定的类加载器加载一个指定名称的对象 */
	public static Object loadObject(String name, ClassLoader loader)
	{
		try
		{
			Class c = (loader != null) ? loader.loadClass(name) : Class
					.forName(name);
			return c.newInstance();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 检测玩家等级
	 * @param lv
	 * @param needLv 等级限制范围
	 * @return true 在等级限制范围内
	 */
	public static boolean chechLv(int lv,int[] needLv)
	{
		if(lv<needLv[0])
			return false;
		if(needLv[1]!=0&&lv>needLv[1])
			return false;
		return true;
	}
	
	
	/**
	 * 组合 xy   
	 * x<<16|y
	 */
	public static int encodePos(int x,int y)
	{
		return x<<16|y;
	}
	
	/**
	 * 解散xy 获得x
	 * r>>16
	 * @return
	 */
	public static int decodePosX(int pos)
	{
		return pos>>16;
	}
	
	
	/**
	 * 翻转数组
	 * @param array
	 * @return
	 */
	public static int[] flipArray(int[] array)
	{
		for (int i = 0; i < array.length / 2; i++) {
			int temp = array[i];
			array[i] = array[array.length - 1 - i];
			array[array.length - 1 - i] = temp;
		}
		return array;
	} 
	
	
	/**
	 * 获得指定长度的随即数组
	 * 比如获得一个 [1,4,2,3,5]
	 * @param arrayLenth  数组长度
	 * @return
	 */
	public static int[] getRandonArray(int arrayLenth)
	{
		int[] arr = new int[arrayLenth];
		for(int i =0;i<arrayLenth;i++)
		{
			arr[i] = i+1;
		}
		Random ran = new Random();
		for(int i =0;i<arrayLenth;i++)
		{
			int startLoc = ran.nextInt(arrayLenth);
			int endLoc = ran.nextInt(arrayLenth);
			if(startLoc==endLoc)
				continue;
			int temp = arr[startLoc];
			arr[startLoc] = arr[endLoc];
			arr[endLoc] = temp;
		}
		return arr;
	}
	
	/**
	 * 获取副本id
	 * @param sceneId
	 * @return
	 */
	public static String getFubenId(String sceneId)
	{
		String[] temp = sceneId.split(":");
		return temp[1];
	}

	/**
	 * 是否是副本
	 * @param sceneId
	 * @return true是副本
	 */
	public static boolean isFuben(String sceneId)
	{
		return sceneId.indexOf(":")!=-1;
	}
	
	/**
	 * 获取服务器id
	 * @param sceneId
	 * @return
	 */
	public static int getServerId(String sceneId)
	{
		String[] temp = sceneId.split(":");
		return Integer.parseInt(temp[0]);
	}
	
	
	/**
	 * 获取副本地图id
	 * @param sceneId
	 * @return
	 */
	public static String getSceneId(String sceneId)
	{
		if(sceneId.indexOf(":")==-1)
		{
			return sceneId;
		}
		String[] temp = sceneId.split(":");
		return temp[3];
	}
	
	
	
	
	/**
	 * 解散xy 获得x
	 * r>>16
	 * @return
	 */
	public static int decodePosY(int pos)
	{
		return pos&0x7FFF;
	}
	

	/**
	 * 读取String
	 * @param map
	 * @param key
	 * @return
	 */
	public static final String readString(Map<String, Object> map,String key)
	{
		Object obj = map.get(key);
		return (String)obj;
	}
	
	/**
	 * 读取Long
	 * @param map
	 * @param key
	 * @return
	 */
	public static final long readLong(Map<String, Object> map,String key)
	{
		Object obj = map.get(key);
		if(obj==null)
			return 0;
		return (Long)obj;
	}
	
	/**
	 * 读取int
	 * @param map
	 * @param key
	 * @return
	 */
	public static final int readInt(Map<String, Object> map,String key)
	{
		Object obj = map.get(key);
		if(obj==null)
			return 0;
		return (Integer)obj;
	}
	
	/**
	 * 读取boolean
	 * @param map
	 * @param key
	 * @return
	 */
	public static final boolean readBool(Map<String, Object> map,String key)
	{
		Object obj = map.get(key);
		if(obj==null)
			return false;
		return (Integer)obj==1;
	}
	
}
